package ig.metrica.ui;

import ig.metrica.ui.modelo.PantallaDatosBasicosModelo;
import ig.metrica.ui.modelo.PantallaDefinicionCambioEsperadoFactores;
import ig.metrica.ui.modelo.ThreadModelos;
import ig.metrica.ui.modelo.modelotablas.ModeloTablaPAFC;
import ig.metrica.ui.modelo.modelotablas.ModeloTablaPAFM;
import ig.metrica.ui.modelo.modelotablas.ModeloTablaPDCEF;
import ig.metrica.ui.modelo.tool.DUpdateRows;
import ig.util.MyTableModel;
import ig.util.TableModelConfFlujos;
import java.awt.Component;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;

/**
 * Define el comportamiento que deben implementar las pantallas que hagan parte
 * de un Wizzard tipo Sevinpro.     
 * @author lfgarcia
 */
public abstract class PantallaSevinproPanel extends JPanel {
    protected javax.swing.JPopupMenu EditarTabla = new javax.swing.JPopupMenu();
    protected javax.swing.JMenuItem MEditarRows = new javax.swing.JMenuItem();;
    public ThreadModelos threadModelos = null;
    public Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
    public PantallaDatosBasicosModelo datosbasicos = null;

    {
        MEditarRows.setText("Editar Selección");
        MEditarRows.setToolTipText("Asigna el mismo valor a cada una de la filas seleccionadas");
        MEditarRows.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MEditarRowsActionPerformed(evt);
            }
        });
        EditarTabla.add(MEditarRows);
    }

    public List getKeyAdd(){
        System.out.println("En "+this.getClass().getName());
        return new ArrayList();
    }

    /**
     * Devuelve el titulo, nombre o descripcion de la pantalla. Este valor se
     * utiliza para ubicar una pantalla en particular, por ello dichos valores
     * para cada pantalla de un wizzard deben ser unicos.
     * @return
     */
    public abstract String getTitulo();

    /**
     * Establece el estado de la pantalla. Al implementar este metodo se deben
     * activar o desactivar todos los componentes de entrada de informacion
     * segun se especifique.
     * @param b
     */
    public abstract void setModificable(boolean b);

    /**
     * Limpia de valores a los campos que hacen parte de la pantalla. Se invoca
     * cuando se presiona el boton Nuevo o despues de eliminar un registro.
     * @throws Exception
     */
    public abstract void limpiarCampos() throws Exception;

    /**
     * Es invocado cuando en el wizar se presiona el boton Salir.
     * @throws java.lang.Exception
     */
    public abstract void salir() throws Exception;

    public Frame getFrame() {
        return frame;
    }

    private Frame frame = null;
    public void setFrame(Frame frame) {
        this.frame = frame;
    }

    public void setThreadEstados(ThreadModelos threadModelos) {
        this.threadModelos = threadModelos;
    }

        /*TableColumn prodFactor = tablaProductos.getColumnModel().getColumn(1);
        TableColumn espcFactor = tablaEspecies.getColumnModel().getColumn(1);
        prodFactor.setCellEditor( new DefaultCellEditor(comboFactor) );
        espcFactor.setCellEditor( new DefaultCellEditor(comboFactor) );

        TableColumn prodTasa = tablaProductos.getColumnModel().getColumn(2);
        TableColumn espcTasa = tablaEspecies.getColumnModel().getColumn(2);
        prodTasa.setCellEditor( new DefaultCellEditor(comboTasas) );
        espcTasa.setCellEditor( new DefaultCellEditor(comboTasas) );

        tablaEspecies.getTableHeader().setReorderingAllowed(false);
        tablaProductos.getTableHeader().setReorderingAllowed(false);*/
    private Hashtable createData(Hashtable hashtable,Hashtable hashtableClon,int[] rows){
        ArrayList factorestemp = new ArrayList(hashtableClon.keySet());
        Collections.sort(factorestemp);
        Object llave = factorestemp.get(rows[0]);
        hashtable.put(llave, hashtableClon.get(llave));
        return hashtable;
    }

    private void MEditarRowsActionPerformed(ActionEvent evt) {
        try {
            javax.swing.JTable tableSouce = (JTable) ((javax.swing.JPopupMenu)((Component)(evt.getSource())).getParent()).getInvoker();
            if(tableSouce.getSelectedRows()!=null && tableSouce.getSelectedRows().length >=1){
                DUpdateRows updateRows = new DUpdateRows(this.getFrame(), true);
                javax.swing.JTable tableUpdate= updateRows.tabla;
                int[] rows=tableSouce.getSelectedRows();
                Hashtable hashtable=new Hashtable();

                if(tableSouce.getModel() instanceof ModeloTablaPAFC){
                    //Definicion de factores riesgos
                    ModeloTablaPAFC modeloTablaPAFC = (ModeloTablaPAFC) tableSouce.getModel();
                    Hashtable hashtableClon= modeloTablaPAFC.getRelacionFactores();
                    hashtable = createData(hashtable, hashtableClon, rows);
                    tableUpdate.setModel( new ModeloTablaPAFC( hashtable,  modeloTablaPAFC.getValorPorDefecto()));
                }else if(tableSouce.getModel() instanceof ModeloTablaPAFM ){
                    //Asociaciond e factores de la Matriz de correlacion
                    ModeloTablaPAFM modeloTablaPAFM = (ModeloTablaPAFM) tableSouce.getModel();
                    Hashtable hashtableClon= modeloTablaPAFM.getRelacionFactores();
                    hashtable = createData(hashtable, hashtableClon, rows);
                    tableUpdate.setModel( new ModeloTablaPAFM( hashtable ));
                }else if(tableSouce.getModel() instanceof ModeloTablaPDCEF){
                    //Definicion del calculo del Cambio esperado
                    ModeloTablaPDCEF modeloTablaPDCEF = (ModeloTablaPDCEF) tableSouce.getModel();
                    Hashtable hashtableClon= modeloTablaPDCEF.getRelacionFactores();
                    hashtable = createData(hashtable, hashtableClon, rows);
                    tableUpdate.setModel( new ModeloTablaPDCEF( modeloTablaPDCEF.getPantalla1() ,hashtable,(PantallaDefinicionCambioEsperadoFactores) this));
                }else if(tableSouce.getModel() instanceof TableModelConfFlujos){
                    //Flujos
                    TableModelConfFlujos tableModelConfFlujos = (TableModelConfFlujos) tableSouce.getModel();
                    Object[][] data= tableModelConfFlujos.getData();
                    tableUpdate.setModel( new TableModelConfFlujos(
                            new Object [][] {{data[rows[0]][0],data[rows[0]][1],data[rows[0]][2],data[rows[0]][3],data[rows[0]][4]}},
                            new String [] {"Altura","Dias","%","Valor Mora","Saldo Capital"},
                            new boolean [] {true,true,true,true,true}));
                }else if(tableSouce.getModel() instanceof MyTableModel ){
                    //Balance
                    MyTableModel myTableModel = (MyTableModel) tableSouce.getModel();
                    Object[][] data= myTableModel.getData();
                    tableUpdate.setModel( new MyTableModel(
                            new Object [][] {{data[rows[0]][0],data[rows[0]][1],data[rows[0]][2]}},
                            new String [] {"Cuenta PUC", "%", "Dias"},
                            new boolean [] {false, true, true}));
                }else{
                    System.out.println("Ojo esto no hace nada");
                    return;
                }

                for (int i = 0; i < getComboBoxsColumnsTable1().length; i++) {
                    if(getComboBoxsColumnsTable1()[i]!=null){
                        TableColumn columna = tableUpdate.getColumnModel().getColumn(i+1);
                        columna.setCellEditor( new DefaultCellEditor(getComboBoxsColumnsTable1()[i]) );
                    }
                }

                updateRows.setVisible(true);
                if(updateRows.isAceptar()){
                    for (int i = 1; i < tableSouce.getColumnCount(); i++) {
                        //Object obj=updateRows.tabla.getValueAt(0, i);
                        Object obj=updateRows.getValueAt(i);
                        if(obj!=null && !obj.toString().trim().isEmpty()){
                            //System.out.println("obj : "+obj);
                            for (int j = 0; j < rows.length; j++) {
                                tableSouce.setValueAt(obj, rows[j], i);
                            }
                        }
                    }
                }
                tableSouce.repaint();
                tableSouce.updateUI();
            }else{
                JOptionPane.showMessageDialog(this.getFrame(), "Seleccione al menos una fila");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public abstract JComboBox[] getComboBoxsColumnsTable1();
    public abstract JComboBox[] getComboBoxsColumnsTable2();

}